package com.moxigua.iotbox.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 时间工具
 * 
 * @author lixl
 * @version 2012-02-02
 */
public class TimeUtil {

	/** 日期格式：yyyy-MM-dd */
	public static final String FORMAT_DATE = "yyyy-MM-dd";
	/** 日期格式：yyyy年MM月dd日 */
	public static final String FORMAT_DATE_CN = "yyyy年MM月dd日";
	/** 日期格式：yyyy-MM-dd hh:mm:ss */
	public static final String FORMAT_DATE_TIME = "yyyy-MM-dd HH:mm:ss";
	/** 日期格式：yyyy-MM-dd */
	public static final String FORMAT_TIME_MIN = "yyyy-MM-dd HH:mm";
	/** 日期格式：dd日HH点mm分 */
	public static final String FORMAT_DAY_HOUR = "MM-dd HH:mm";

	/**
	 * 得到当前时间
	 * 
	 * @param timeFormat
	 * @return nowstr
	 */
	public static Date getNowTime() {
		Date now = new Date();
		return now;
	}

	/**
	 * 得到当前时间
	 * 
	 * @param timeFormat
	 * @return nowstr
	 */
	public static String getNowTime(String f) {
		return getDateFormatter(f).format(new Date());
	}

	/**
	 * SimpleDateFormat到格式的日期
	 * 
	 * @param formatString
	 * @return SimpleDateFormat
	 */
	private static SimpleDateFormat getDateFormatter(String f) {
		SimpleDateFormat formatter = new SimpleDateFormat(f);
		formatter.setTimeZone(java.util.TimeZone.getDefault());
		formatter.setLenient(false);
		return formatter;
	}

	/**
	 * 获得当前时间Calendar格式
	 * 
	 * @param d
	 * @return now date
	 */
	public static Calendar getCalendar(Date d) {
		Calendar now = Calendar.getInstance();
		now.setTime(d);
		return now;
	}

	/**
	 * String到Date格式的转换
	 * 
	 * @param dateString
	 * @param formatString
	 * @return date Date
	 */
	public static Date stringToDate(String d, String f) {
		// will throw exception if can't parse
		try {
			return getDateFormatter(f).parse(d);
		} catch (ParseException e) {
			return null;
		} catch (NumberFormatException e) {
			return null;
		}
	}

	/**
	 * string 到 date 的转换
	 * 
	 * @param d
	 * @param f
	 * @return
	 */
	public static Long stringToLong(String d, String f) {
		Date date = stringToDate(d, f);
		if (date == null) {
			return null;
		}
		return date.getTime();
	}

	/**
	 * date到String格式的转换
	 * 
	 * @param date
	 * @param format
	 * @return date String
	 */
	public static String dateToString(Date d, String f) {
		return getDateFormatter(f).format(d);
	}

	/**
	 * Long到String格式的转换
	 * 
	 * @param d
	 * @param f
	 * @return date String
	 */
	public static String longToString(Long d, String f) {
		if (d == null)
			return "";
		return dateToString(longToDate(d), f);
	}

	/**
	 * 当前时间的long格式,除以1000以Integer表示. 主要用于与c++交换日期,缺点是没有毫秒值.
	 * 
	 * @return longDate Integer
	 */
	public static Integer nowDateToInteger() {
		return Integer.valueOf(String.valueOf(getNowTime().getTime() / 1000));
	}

	/**
	 * 转换指定日期到Integer格式
	 * 
	 * @param date
	 * @return date Integer
	 */
	public static Integer dateToInteger(Date date) {
		if (date == null) {
			return new Integer(0);
		} else {
			return Integer.valueOf(String.valueOf(date.getTime() / 1000));
		}
	}

	/**
	 * integer to Date 主要用于从c++中传入的日期类型转换为Date类型.
	 * 
	 * @param date
	 * @return date Date
	 */
	public static Date integerToDate(Integer date) {
		Calendar cal = Calendar.getInstance();
		cal.setTimeInMillis(((long) date.intValue()) * 1000);
		return cal.getTime();
	}

	/**
	 * 转换现在的时间为Long格式 以毫秒为单位计算,从1970年1月1日0时0分0秒0000毫秒算起.
	 * 
	 * @return longDate long
	 */
	public static long dateTolong() {
		return getNowTime().getTime();
	}

	/**
	 * @see this.dateTolong
	 * 
	 * @return longDate Long
	 */
	public static Long dateToLong() {
		return new Long(getNowTime().getTime());
	}

	/**
	 * this.dateTolong
	 * 
	 * @return longDate string
	 */
	public static String dateToLongString() {
		return String.valueOf(getNowTime().getTime());
	}

	/**
	 * long转换为日期
	 * 
	 * @param date
	 * @return date Date
	 */
	public static Date longToDate(long d) {
		return new Date(d);
	}

	/**
	 * integer to Date
	 * 
	 * @param date
	 * @return date Date
	 */
	public static Date intToDate(long date) {
		Calendar cal = Calendar.getInstance();
		cal.setTimeInMillis((date));
		return cal.getTime();
	}

	/**
	 * long转换为日期
	 * 
	 * @param date
	 * @return date Date
	 */
	public static Date longToDate(Long d) {
		return new Date(d.longValue());
	}

	/**
	 * int到String格式的转换
	 * 
	 * @param d
	 * @param f
	 * @return date String
	 */
	public static String intToString(long d, String f) {
		if (d == 0) {
			return "";
		}
		return dateToString(intToDate(d), f);
	}

	/**
	 * long到String格式的转换
	 * 
	 * @param d
	 * @param f
	 * @return
	 */
	public static String longToString(long d, String f) {
		SimpleDateFormat sdf = new SimpleDateFormat(f);
		return sdf.format(new Date(d));
	}
}